﻿namespace ConsoleApp1
{
    //c2.0
    /*
     1、泛型
     2、分部类型
     3、匿名方法
     4、可以为null的值类型
     5、迭代器
     6、协变和逆变
     */

    //1、泛型
    //概念:使用占位符T来代表某种类型，编译期间决定其具体类型
    //格式: class MyGeneric<T>
    //使用:MyGeneric<int> mg = new MyGeneric<int();

    class person<T>
    {
        public T Id { get; set; }
    }
    //将父类进行特化，然后继承
    class student :person<int> 
    { 

    }
    //无法在Class Teacher子类声明的时候决定父类的泛型类型
    class teacher<B> : person<B>
    {

    }


    class store<T, U>
    {
        public T Value { get; set; }
        public U Value1 { get; set; }

        public T[] arr = new T[10];

        public U[] arr1 = new U[10];
    }


    internal class Program
    {
        static void Main(string[] args)
        {
            int x = 10; int y = 20;
            Console.WriteLine($"x={x},y={y}");
            Swap<int>(ref y, ref x);
            Console.WriteLine($"交换后:x={x},y={y}");
            Console.WriteLine("4+5={0}", Add<int>(4, 5));

        }


        static public void Swap<T>(ref T a, ref T b)
        {
            T temp = a;
            a = b;
            b = temp;
        }

        static public T Add<T>(T a, T b)
        {
            //通过"dynamic”将类型校验推迟到运行时
            dynamic da = a;
            dynamic db = b;
            return da + db;
        }
    }





}